<?php
/**
 * 封装通讯接口数据方法
 * @author kincai
 *
 */
header("content-type:text/html;charset=utf-8");
class Response {
	const JSON = "json";

	/**
	 * 按综合方式输出通信数据
	 *
	 * @param integer $code
	 *        	状态码
	 * @param string $message
	 *        	提示信息
	 * @param array $data
	 *        	数据
	 * @param string $type
	 *        	数据类型
     * @return string
	 */
	public static function show($code, $message = '', $data = array(), $type = self::JSON) {
		if (! is_numeric ( $code )) {
			return '';
		}

		// isset() ：检测变量是否设置
		// 若变量不存在则返回 FALSE
		// 若变量存在且其值为NULL，也返回 FALSE
		// 若变量存在且值不为NULL，则返回 TURE
		// $_GET 变量用于收集来自 method="get" 的表单中的值。
		//http://localhost:888/Mukewang_app_api/test.php?format=xml
		//比如 ?format=xml 那么$_GET ['format']就是存在的 isset()就是true 则 $_GET ['format']获取=后面的xml给$type 没有传值 那就默认值json
		$type = isset ( $_GET ['format'] ) ? $_GET ['format'] : self::JSON;

		$result = array (
				'code' => $code,
				'msg' => $message,
				'data' => $data
		);

		if ($type == 'json') {
			self::json ( $code, $message, $data );
			exit ();
		} elseif ($type == 'array') {
			var_dump ( $result );
		} elseif ($type == 'xml') {
			self::xmlEncode ( $code, $message, $data );
			exit ();
		} else {
			// TODO
		}
	}

	/**
	 * 按json方式输出通信数据
	 *
	 * @param integer $code
	 *        	状态码
	 * @param string $message
	 *        	提示信息
	 * @param array $data
	 *        	数据
     * @return string
	 */
	public static function json($code, $message = '', $data = array()) {
		// is_numeric()检测变量是否为数字或数字字符串
		if (! is_numeric ( $code )) {
			return '';
		}
		if(!is_array($message)){
            $message = urlencode($message);
        }
		if($data == null) {
		    $result = array (
		        'code' => $code,
		        'msg' => $message
		    );
		} else {
		    $result = array (
		        'code' => $code,
		        'msg' => $message,
		        'data' =>$data
		    );
		}
//
		
		//只判断了最多两重数组的情况
// 		if($data!=null) {
// 			foreach ($data as $key=>$values) {
// 	// 			var_dump($values);
// 				if(is_array($values)) {
// 					foreach ($values as $keys=>$value) {

// 					    if(is_array($value)) {

// 					    } else {

// 					    }
// 						$newData[$keys] = urlencode($value);//进行编码  使用urlencode处理 含有中文的字段
// 					}
// 					$datas[$key] = $newData;
// 				} else {
// 					$datas[$key] = urlencode($values);
// 				}


// 			}
// 		}
		
//
		//看编码
// 		$encode = mb_detect_encoding($datas, array("ASCII",'UTF-8','GB2312',"GBK",'BIG5'));
// 		echo $encode;exit;
// 		iconv('utf-8','utf-8',$result);//iconv('原编码','转换的编码',$data);
		//编码之后在进行解码urldecode  生成的json数据就可以识别中文
		echo urldecode(json_encode ( $result )); // 转为json数据 只支持utf-8  我们这里是utf-8的 所以不要转编码就可以
		exit (); // 退出当前脚本
// 		return data;
//         var_dump(json_encode ( $result ));
	}


	/**
	 * 按xml方式输出通信数据
	 *
	 * @param integer $code
	 *        	状态码
	 * @param string $message
	 *        	提示信息
	 * @param array $data
	 *        	数据
	 * @return string
	 */
	public static function xmlEncode($code, $message, $data = array()) {
		if (! is_numeric ( $code )) {
			return '';
		}

		$result = array (
				'code' => $code,
				'message' => $message,
				'data' => $data
		);

		header ( "Content-Type:text/xml" ); // 指定页面显示类型 加上这句就可以在网页上直接就显示xml格式
		$xml = "<?xml version='1.0' encoding='UTF-8'?>\n"; // 头信息
		$xml .= "<root>\n";

		$xml .= self::xmlToEncode ( $result );

		$xml .= "</root>";
		echo $xml;
	}
	public static function xmlToEncode($data) {
		$xml = $attr = "";
		foreach ( $data as $key => $value ) {
			if (is_numeric ( $key )) { // 是数字才这样 如果不是数字呢 那就只能把key当成节点使用 参考下面两个不同例子
				$attr = " id='{$key}'";
				$key = "item"; // 原本他的key是被当成节点使用的 所以自己把节点改为item
			}
			$xml .= "<{$key}{$attr}>"; // 也就是<"item" id='{$key}' >//组装起来
			$xml .= is_array ( $value ) ? self::xmlToEncode ( $value ) : $value; // 如果遍历的值还有是数组的话 就要再把里面的数组遍历转为xml
			$xml .= "</{$key}>\n";
		}
		return $xml;
	}
}

// 数组里面有数组 里面的数组是array(1,5,3);索引数组
/* -<root>

<code>200</code>

<message>jijij</message>


-<data>

<id>1</id>

<name>kij</name>


-<type>

<item id="0">1</item>

<item id="1">5</item>

<item id="2">3</item>

</type>

</data>

</root> */


// 数组里面有数组 里面的数组是array("dd"=>"dd","ss"=>"ss","s"=>"s");关联数组
/* -<root>

<code>200</code>

<message>jijij</message>


-<data>

<id>1</id>

<name>kij</name>


-<type>

<dd>dd</dd>

<ss>ss</ss>

<s>s</s>

</type>

</data>

</root> */